/*
 * game.c
 *
 *  Created on: 2010/04/27
 *      Author: ei08111
 */

#include "game.h"

#define MAX_LINE_SIZE 15
#define MAX_WORD_SIZE 15

int get_num_words() {
	FILE * ficheiro;
	int count = 0;
	char line[30];
	ficheiro = fopen("words.txt", "r");
	if (ficheiro != NULL) {
		while(fgets(line, MAX_LINE_SIZE, ficheiro) != NULL) {
			count++;
		}
	}
	return count;
}

int generate() {
	int num_words = get_num_words();
	int result = 0;
	if(num_words == 0) {
		printf("Nenhuma palavra encontrada!\n");
		exit(1);
	}
	result = rand() % num_words + 1;
	return result;
}

char *get_random_word() {
	int rand_num;
	rand_num = generate();
	static char line[MAX_LINE_SIZE];
	FILE * ficheiro;
	ficheiro = fopen("words.txt", "r");
	fseek ( ficheiro , 0, SEEK_SET );
	int i;
	for(i = 0; i < rand_num; i++)
		fgets(line, MAX_LINE_SIZE, ficheiro);
	i = 0;
	while(line[i] != (int)NULL) {
		if(line[i]== '\n') line[i]= '\0';
		i++;
	}
	fclose(ficheiro);
	return line;
}

char *hide_word(char* random_word) {
	int size = 0;
	size = strlen(random_word);
	static char word[MAX_WORD_SIZE];
	int i;
	for(i = 0; i < size; i++) {
		word[i] = '*';
	}
	word[i] = '\0';
	return word;
}

char *game_help(char* random_word, char* hide_word) {
	int n = rand() % strlen(random_word);
	if(random_word[n] == hide_word[n]) {
		game_help(random_word, hide_word);
	}else{
		hide_word[n] = random_word[n];
	}
	return hide_word;
}

char *game_guess(char* random_word, char* hide_word, char* guess) {
	int size = 0;
	size = strlen(random_word);
	int i;
	for(i=0; i < size; i++) {
		if(random_word[i] == guess[i])
		hide_word[i] = random_word[i];
	}
	return hide_word;
}

char process(char* guess, char* rword, char c, int i) {
	char* check;
	check = strchr(rword, c);
	if(rword[i] == c) {
		return 'r';
	}
	if(check == NULL) {
		return 'n';
	}else {
		return 'w';
	}
}

char* validate(char* random_word, char* guess) {
	static char result[MAX_WORD_SIZE];
	static char rword[MAX_WORD_SIZE];
	static char guesscpy[MAX_WORD_SIZE];
	int i=0;
	while(guess[i] != (int)NULL) {
		if(guess[i]== '\n') guess[i]= '\0';
		i++;
	}
	strcpy(rword,random_word);
	strcpy(guesscpy,guess);
	int size = strlen(random_word);
	int size2 = strlen(guess);
	if(size != size2)
		return NULL;
	for(i=0; i < size; i++) {
		result[i] = process(guesscpy, rword, guess[i], i);
	}
	result[i] = '\0';
	return result;
}
char *win_word(char* game_word) {
	int n_chars = 0;
	char* win;
	int i;
	while(game_word[i] != '\0') {
		n_chars++;
	}
	for(i=0; i < n_chars; i++)
	{
		win[i] = 'r';
	}
	win[n_chars] = '\0';
	return win;
}

int load(char ** nomes, int * pontos)
{
	FILE *txt;
	string str, ola;
	int pont, i=0;

	if((txt = fopen("highscore.txt", "r")) == NULL)
	{
		perror("Erro ao abrir ficheiro!");
		exit(1);
	}
	
	while(fgets(str,50,txt))
	{
		nomes[i]=(char*)malloc(sizeof(char)*strlen(str));
		str[strlen(str)-1]='\0';
		strcpy(nomes[i],str);

		//convert string to int
		fgets(ola,50,txt);
		pont= atoi(ola);
		pontos[i]=pont;
		i++;
	}
	fclose(txt);

	return i;
}

void save(char ** nomes, int * pontos, int num)
{
	int i=0;
	string str;

	FILE *txt;

	/* Cria Arquivo.txt no diretorio onde o programa ? executado
	caso Arquivo.txt j? exista, abre com para adicionando dados
	apartir do seu fim.
	E testa se conseguiu criar ou abrir Arquivo.txt
	*/
	if((txt = fopen("highscore.txt", "w")) == NULL)
	{
		perror("Erro ao abrir ficheiro!");
		exit(1);
	}

	while(i < num)
	{
		strcpy(str, nomes[i]);
		fprintf(txt, "%s\n", str);//imprime o nome, e o caracter de nova linha \n para o arquivo
		fprintf(txt, "%i\n", pontos[i]);	
		i++;
	}


	//fecha arquivo
	fclose(txt);
}

void add_highscore(int score, char* name)
{
	char * nomes[11];
	char tmp_name[20];
	int pontos[11], num=0,tmp_score=0;

	num=load(nomes, pontos);
	nomes[num]=(char*)malloc(sizeof(char)*strlen(name));
	strcpy(nomes[num],name);
	pontos[num]=score;
	int i=num;
	
	
	while(i>0)
	{
		if(pontos[i-1]<pontos[i])
		{
			tmp_score=pontos[i-1];
			strcpy(tmp_name,nomes[i-1]);
			
			pontos[i-1]=pontos[i];
			strcpy(nomes[i-1],nomes[i]);
			
			pontos[i]=tmp_score;
			strcpy(nomes[i],tmp_name);
		}
		--i;
	}
	if(num+1>10) num=8;
	
	save(nomes, pontos, num+1);
}
